www.gusucode.com > 有监督的 CNN 网络完成对MNIST 数字的识别 > 有监督的 CNN 网络完成对MNIST 数字的识别/CNN—卷积神经网络数字识别/@cnn/sim.m
function [out, cnet] = sim(cnet,inp) %SIM simulate convolutional neural network % % Syntax % % [out, sinet] = sim(cnet,inp) % % Description % Input: % cnet - Convolutional neural network class object % inp - input image % Output: % cnet - Convolutional neural network with unchanged weignts and biases % but with saved layers outputs % out - simulated neural network output %Supposed that input image is preprocessed to zero mean and 1 deviation %Subsampling cnet.SLayer{1}.SS{1} = subsample(inp,cnet.SLayer{1}.SRate); cnet.SLayer{1}.YS{1} = cnet.SLayer{1}.SS{1}.*cnet.SLayer{1}.WS{1}+cnet.SLayer{1}.BS{1} ; %Transfer (activation,sqashing) function cnet.SLayer{1}.XS{1} = feval(cnet.SLayer{1}.TransfFunc,cnet.SLayer{1}.YS{1}); %Main layer loop for k=2:(cnet.numLayers-cnet.numFLayers) %(First layer is dummy, skip it) if(rem(k,2)) %Parity check %S-layer for l=1:cnet.CLayer{k-1}.numFMaps %For all feature maps from previous layer %Subsampling %Reshape output matrix to 1-D vector XC = reshape(cnet.CLayer{k-1}.XC,1,[]); cnet.SLayer{k}.SS{l} = subsample(XC{l},cnet.SLayer{k}.SRate); cnet.SLayer{k}.YS{l} = cnet.SLayer{k}.SS{l}*cnet.SLayer{k}.WS{l}+cnet.SLayer{k}.BS{l} ; %Apply transfer function cnet.SLayer{k}.XS{l} = feval(cnet.SLayer{k}.TransfFunc,cnet.SLayer{k}.YS{l}); end else %C-layer YC = num2cell(zeros(cnet.CLayer{k}.numKernels,1)); for l=1:cnet.CLayer{k}.numKernels %For all convolutional kernels for m=find(cnet.CLayer{k}.ConMap(l,:)) %For all feature maps of previous layer and according to connection map %Convolute and accumulate YC{l} = YC{l}+fastFilter2(cnet.CLayer{k}.WC{l},cnet.SLayer{k-1}.XS{m},'valid')+cnet.CLayer{k}.BC{l}; end end cnet.CLayer{k}.YC = YC; cnet.CLayer{k}.XC=cnet.CLayer{k}.YC; %For C-Layers transfer function is linear end end %Important assumption is made that after last C-Layer all feature maps are %become 1x1 size, so the output is not a matrix but a vector %This should be considered while synthesizing the neural network structure %Convert the cell array of single values to a vector XC = cell2mat(cnet.CLayer{k}.XC)'; for k=(cnet.numLayers-cnet.numFLayers+1):cnet.numLayers %If the previous layer was C-Layer if (k == cnet.numCLayers+cnet.numSLayers+1) cnet.FLayer{k}.Y = XC*cnet.FLayer{k}.W+cnet.FLayer{k}.B; cnet.FLayer{k}.X = feval(cnet.FLayer{k}.TransfFunc,cnet.FLayer{k}.Y); else cnet.FLayer{k}.Y = cnet.FLayer{k-1}.X*cnet.FLayer{k}.W+cnet.FLayer{k}.B; cnet.FLayer{k}.X = feval(cnet.FLayer{k}.TransfFunc,cnet.FLayer{k}.Y); end end out = cnet.FLayer{k}.X;